#include "SocketAddress.h"
#include "Utils.h"

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -save
//
// Member not defined
//lint -esym(1526, CSocketAddress::CSocketAddress)
//lint -esym(1526, CSocketAddress::operator=)
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

namespace OldDreamTools {
namespace Win32 {

///////////////////////////////////////////////////////////////////////////////
// Static helper functions
///////////////////////////////////////////////////////////////////////////////

static _tstring DeblockSockAddr(
   const sockaddr *pSockAddr);

///////////////////////////////////////////////////////////////////////////////
// CSocketAddress
///////////////////////////////////////////////////////////////////////////////

CSocketAddress::CSocketAddress(
   const sockaddr *pSockAddr)
   : m_address(DeblockSockAddr(pSockAddr))
{

}

_tstring CSocketAddress::GetAsString() const
{
   return m_address;
}

///////////////////////////////////////////////////////////////////////////////
// Static helper functions
///////////////////////////////////////////////////////////////////////////////

static _tstring DeblockSockAddr(
   const sockaddr *pSockAddr)
{
   USES_CONVERSION;

   if (pSockAddr->sa_family != AF_INET)
   {
      return _T("CSocketAddress() - TODO - we only handle AF_INET address at present");
   }

   const sockaddr_in *pSockAddrIn = reinterpret_cast<const sockaddr_in *>(pSockAddr);

   //lint -e40 Undeclared identifier inet_ntoa (wierd! it's in winsock2.h)
   //lint -e64 Type mismatch, just due to the above problem
   _tstring address(A2T(::inet_ntoa(pSockAddrIn->sin_addr)));

   return address + _T(":") + ToString(pSockAddrIn->sin_port);
}

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools::Win32
///////////////////////////////////////////////////////////////////////////////

} // End of namespace Win32
} // End of namespace OldDreamTools

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// End of file...
///////////////////////////////////////////////////////////////////////////////
